์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค๋ ๋ ์์ ์์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ JavaScript SharedArrayBuffer ๋ฐ Atomics๋ฅผ ํ๊ตฌํฉ๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ, ๊ทธ๋ฆฌ๊ณ ๊ฒฝ์ ์กฐ๊ฑด์ ํผํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์ธ์.
JavaScript SharedArrayBuffer ๋ฐ Atomics: ์ค๋ ๋ ์์ ์์ ๊ตฌํ
์ ํต์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋ ์ธ์ด๋ก ์๋ ค์ง JavaScript๋ Web Workers๋ฅผ ํตํด ๋์์ฑ์ ์์ฉํ๋๋ก ๋ฐ์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋์์ฑ์ ๊ณผ๊ฑฐ์ ์กด์ฌํ์ง ์์ ๋ธ๋ผ์ฐ์ ๋ด์์ ๊ณ ์ฑ๋ฅ ๋ณ๋ ฌ ์ปดํจํ
์ ์ ์ฌ๋ ฅ์ ์ ํํ์ต๋๋ค. SharedArrayBuffer์ Atomics์ ๋์
์ผ๋ก JavaScript๋ ์ด์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ๋ฌ ์ค๋ ๋์์ ์ ๊ทผ์ ๋๊ธฐํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์ฑ๋ฅ์ ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์์ต๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ Atomics์ ํ์์ฑ ์ดํด
์์ธํ ๋ด์ฉ์ ๋ค์ด๊ฐ๊ธฐ ์ ์, ํน์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์์์ (atomic) ์ฐ์ฐ์ด ์ ํ์์ ์ธ์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ๋ณต์กํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ธ์. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ค๋ฉด, Web Workers ๊ฐ์ ๋์ฉ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ(์ ์ฒด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณต์ฌํ๋ ์์ )๋ฅผ ํฌํจํ๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ด ๋ฉ๋๋ค. ์ด๋ฌํ ์ค๋ฒํค๋๋ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ Web Workers๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ง์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋๋ก ํ์ฌ ๋ฐ์ดํฐ ๋ณต์ฌ์ ํ์์ฑ์ ์์ฑ๋๋ค. ๊ทธ๋ฌ๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ๋์ ์ ๊ทผ์ ๊ฒฝ์ ์กฐ๊ฑด(race conditions)์ ์ํ์ ์ด๋ํฉ๋๋ค. ์ฆ, ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ค๊ณ ์๋ํ์ฌ ์์ธกํ ์ ์๊ณ ์ ์ฌ์ ์ผ๋ก ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ ์ํฉ์ ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ Atomics๊ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
SharedArrayBuffer๋?
SharedArrayBuffer๋ ArrayBuffer์ ์ ์ฌํ๊ฒ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ํ๋ด๋ JavaScript ๊ฐ์ฒด์ด์ง๋ง, ๊ฒฐ์ ์ ์ธ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ์ฆ, Web Workers์ ๊ฐ์ ์ฌ๋ฌ ์คํ ์ปจํ
์คํธ ๊ฐ์ ๊ณต์ ๋ ์ ์๋ค๋ ์ ์
๋๋ค. ์ด๋ฌํ ๊ณต์ ๋ SharedArrayBuffer ๊ฐ์ฒด๋ฅผ ํ๋ ์ด์์ Web Workers๋ก ์ ์กํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋๋ค. ํ ๋ฒ ๊ณต์ ๋๋ฉด ๋ชจ๋ ์์ปค๋ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
์์: SharedArrayBuffer ์์ฑ ๋ฐ ๊ณต์
๋จผ์ , ๋ฉ์ธ ์ค๋ ๋์์ SharedArrayBuffer๋ฅผ ์์ฑํฉ๋๋ค:
const sharedBuffer = new SharedArrayBuffer(1024); // 1KB ๋ฒํผ
๊ทธ๋ฐ ๋ค์, Web Worker๋ฅผ ์์ฑํ๊ณ ๋ฒํผ๋ฅผ ์ ์กํฉ๋๋ค:
const worker = new Worker('worker.js');
worker.postMessage(sharedBuffer);
worker.js ํ์ผ์์ ๋ฒํผ์ ์ ๊ทผํฉ๋๋ค:
self.onmessage = function(event) {
const sharedBuffer = event.data; // ์์ ๋ SharedArrayBuffer
const uint8Array = new Uint8Array(sharedBuffer); // ํ์
์ด ์ง์ ๋ ๋ฐฐ์ด ๋ทฐ ์์ฑ
// ์ด์ uint8Array์ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํฉ๋๋ค.
uint8Array[0] = 42; // ์์: ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ์ ์ฐ๊ธฐ
};
์ค์ ๊ณ ๋ ค ์ฌํญ:
- Typed Arrays (ํ์
๋ฐฐ์ด):
SharedArrayBuffer๋ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ํ๋ด์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ํ์ ๋ฐฐ์ด(์:Uint8Array,Int32Array,Float64Array)์ ์ฌ์ฉํ์ฌ ์ํธ ์์ฉํฉ๋๋ค. ํ์ ๋ฐฐ์ด์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ๊ตฌ์กฐํ๋ ๋ทฐ๋ฅผ ์ ๊ณตํ์ฌ ํน์ ๋ฐ์ดํฐ ์ ํ์ ์ฝ๊ณ ์ธ ์ ์๋๋ก ํฉ๋๋ค. - ๋ณด์: ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. ์ฝ๋๊ฐ Web Workers๋ก๋ถํฐ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒ์ฆํ๊ณ ์
์์ ์ธ ํ์์๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ทจ์ฝ์ ์ ์
์ฉํ์ง ๋ชปํ๋๋ก ๋ฐฉ์งํด์ผ ํฉ๋๋ค.
Cross-Origin-Opener-Policy๋ฐCross-Origin-Embedder-Policyํค๋์ ์ฌ์ฉ์ Spectre ๋ฐ Meltdown ์ทจ์ฝ์ ์ ์ํํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ํค๋๋ ์ฌ์ฉ์ ์๋ณธ์ ๋ค๋ฅธ ์๋ณธ์ผ๋ก๋ถํฐ ๊ฒฉ๋ฆฌํ์ฌ ๋ค๋ฅธ ์๋ณธ์ด ์ฌ์ฉ์ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
Atomics๋?
Atomics๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์น์์ ์ฝ๊ธฐ-์์ -์ฐ๊ธฐ ์์
์ ์ํํ๊ธฐ ์ํ ์์์ ์ฐ์ฐ์ ์ ๊ณตํ๋ JavaScript์ ์ ์ ํด๋์ค์
๋๋ค. ์์์ ์ฐ์ฐ์ ๋ถํ ๋ถ๊ฐ๋ฅํจ์ด ๋ณด์ฅ๋ฉ๋๋ค. ์ฆ, ๋จ์ผ์ ์ค๋จ ์๋ ๋จ๊ณ๋ก ์คํ๋ฉ๋๋ค. ์ด๋ ์์
์ด ์งํ๋๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ฐ์ฐ์ ๋ฐฉํดํ ์ ์๋๋ก ๋ณด์ฅํ์ฌ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํฉ๋๋ค.
์ฃผ์ Atomics ์ฐ์ฐ:
Atomics.load(typedArray, index): ํ์ ๋ฐฐ์ด์ ์ง์ ๋ ์ธ๋ฑ์ค์์ ๊ฐ์ ์์์ ์ผ๋ก ์ฝ์ต๋๋ค.Atomics.store(typedArray, index, value): ํ์ ๋ฐฐ์ด์ ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์ ์์์ ์ผ๋ก ์๋๋ค.Atomics.compareExchange(typedArray, index, expectedValue, replacementValue): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์expectedValue์ ์์์ ์ผ๋ก ๋น๊ตํฉ๋๋ค. ๊ฐ์ด ๊ฐ์ผ๋ฉดreplacementValue๋ก ๋์ฒด๋ฉ๋๋ค. ํด๋น ์ธ๋ฑ์ค์ ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.add(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์value๋ฅผ ์์์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.sub(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์์value๋ฅผ ์์์ ์ผ๋ก ๋นผ๊ณ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.and(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ๊ณผvalue์ ๋ํด ๋นํธwise AND ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ํํ๊ณ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.or(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ๊ณผvalue์ ๋ํด ๋นํธwise OR ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ํํ๊ณ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.xor(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ๊ณผvalue์ ๋ํด ๋นํธwise XOR ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ํํ๊ณ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.exchange(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์value๋ก ์์์ ์ผ๋ก ๋์ฒดํ๊ณ ์ด์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.wait(typedArray, index, value, timeout): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์ดvalue์ ๋ฌ๋ผ์ง๊ฑฐ๋ ํ์์์์ด ๋ง๋ฃ๋ ๋๊น์ง ํ์ฌ ์ค๋ ๋๋ฅผ ์ฐจ๋จํฉ๋๋ค. ์ด๋ ๋๊ธฐ/์๋ฆผ(wait/notify) ๋ฉ์ปค๋์ฆ์ ์ผ๋ถ์ ๋๋ค.Atomics.notify(typedArray, index, count): ์ง์ ๋ ์ธ๋ฑ์ค์์ ๋๊ธฐ ์ค์ธ ์ค๋ ๋count๊ฐ๋ฅผ ๊นจ์๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
SharedArrayBuffer์ Atomics๊ฐ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ์ค๋ช
ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ๋ณ๋ ฌ ๊ณ์ฐ: ์ด๋ฏธ์ง ์ฒ๋ฆฌ
๋ธ๋ผ์ฐ์ ์์ ๋์ฉ๋ ์ด๋ฏธ์ง์ ํํฐ๋ฅผ ์ ์ฉํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ด๋ฏธ์ง๋ฅผ ์ฒญํฌ๋ก ๋๋๊ณ ๊ฐ ์ฒญํฌ๋ฅผ ๋ค๋ฅธ Web Worker์ ํ ๋นํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. SharedArrayBuffer๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒด ์ด๋ฏธ์ง๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์ ์์ด ์์ปค ๊ฐ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ํ์๊ฐ ์์ต๋๋ค.
๊ตฌํ ์ค์ผ์น:
- ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ
SharedArrayBuffer์ ๋ก๋ํฉ๋๋ค. - ์ด๋ฏธ์ง๋ฅผ ์ง์ฌ๊ฐํ ์์ญ์ผ๋ก ๋๋๋๋ค.
- Web Workers ํ์ ์์ฑํฉ๋๋ค.
- ๊ฐ ์์ญ์ ์์ปค์ ํ ๋นํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. ์์ปค์๊ฒ ์์ญ์ ์ขํ์ ํฌ๊ธฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ๊ฐ ์์ปค๋ ํ ๋น๋ ์์ญ์ ํํฐ๋ฅผ ๊ณต์
SharedArrayBuffer๋ด์์ ์ ์ฉํฉ๋๋ค. - ๋ชจ๋ ์์ปค๊ฐ ์์ ์ ์๋ฃํ๋ฉด, ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
Atomics๋ฅผ ์ฌ์ฉํ ๋๊ธฐํ:
๋ชจ๋ ์์ปค๊ฐ ์์ญ ์ฒ๋ฆฌ๋ฅผ ๋ง์ณค๋์ง ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ ์ ์๋๋ก ์์์ ์นด์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ ์์ปค๋ ์์
์ ๋ง์น ํ ์นด์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ฆ๊ฐ์ํต๋๋ค. ๋ฉ์ธ ์ค๋ ๋๋ Atomics.load๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ๊ธฐ์ ์ผ๋ก ์นด์ดํฐ๋ฅผ ํ์ธํฉ๋๋ค. ์นด์ดํฐ๊ฐ ์์ ๊ฐ(์์ญ ์์ ๊ฐ์)์ ๋๋ฌํ๋ฉด ๋ฉ์ธ ์ค๋ ๋๋ ์ ์ฒด ์ด๋ฏธ์ง ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์์์ ์๊ฒ ๋ฉ๋๋ค.
// ๋ฉ์ธ ์ค๋ ๋์์:
const numRegions = 4; // ์์: ์ด๋ฏธ์ง๋ฅผ 4๊ฐ ์์ญ์ผ๋ก ๋๋
const completedRegions = new Int32Array(sharedBuffer, offset, 1); // ์์์ ์นด์ดํฐ
Atomics.store(completedRegions, 0, 0); // ์นด์ดํฐ๋ฅผ 0์ผ๋ก ์ด๊ธฐํ
// ๊ฐ ์์ปค์์:
// ... ์์ญ ์ฒ๋ฆฌ ...
Atomics.add(completedRegions, 0, 1); // ์นด์ดํฐ ์ฆ๊ฐ
// ๋ฉ์ธ ์ค๋ ๋์์ (์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธ):
let count = Atomics.load(completedRegions, 0);
if (count === numRegions) {
// ๋ชจ๋ ์์ญ ์ฒ๋ฆฌ ์๋ฃ
console.log('์ด๋ฏธ์ง ์ฒ๋ฆฌ ์๋ฃ!');
}
2. ๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ: ๋ก-ํ๋ฆฌ ํ ๊ตฌ์ถ
SharedArrayBuffer์ Atomics๋ ํ์ ๊ฐ์ ๋ก-ํ๋ฆฌ(lock-free) ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ก-ํ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ํต์ ์ธ ๋ก์ ์ค๋ฒํค๋ ์์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.
๋ก-ํ๋ฆฌ ํ์ ๊ณผ์ :
- ๊ฒฝ์ ์กฐ๊ฑด: ํ์ ํค๋ ๋ฐ ํ ์ผ ํฌ์ธํฐ์ ๋ํ ๋์ ์ ๊ทผ์ ๊ฒฝ์ ์กฐ๊ฑด์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์์๋ฅผ ํ์ ๋ฃ๊ฑฐ๋ ํ์์ ์ ๊ฑฐํ ๋ ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋ณด์ฅํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๋๊ธฐํ๋ฅผ ์ํ Atomics ์ฐ์ฐ:
์์์ ์ฐ์ฐ์ ํค๋ ๋ฐ ํ
์ผ ํฌ์ธํฐ๊ฐ ์์์ ์ผ๋ก ์
๋ฐ์ดํธ๋๋๋ก ๋ณด์ฅํ์ฌ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, Atomics.compareExchange๋ ์์๋ฅผ ํ์ ๋ฃ์ ๋ ํ
์ผ ํฌ์ธํฐ๋ฅผ ์์์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
3. ๊ณ ์ฑ๋ฅ ์์น ๊ณ์ฐ
๊ณผํ ์๋ฎฌ๋ ์ด์
์ด๋ ๊ธ์ต ๋ชจ๋ธ๋ง๊ณผ ๊ฐ์ ์ง์ค์ ์ธ ์์น ๊ณ์ฐ์ ํฌํจํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ SharedArrayBuffer์ Atomics๋ฅผ ์ฌ์ฉํ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก๋ถํฐ ์๋นํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ๋๊ท๋ชจ ์์น ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ณ ์ฌ๋ฌ ์์ปค์ ์ํด ๋์์ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก
SharedArrayBuffer์ Atomics๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์ ์คํ ๊ณ ๋ ค๊ฐ ํ์ํ ๋ณต์ก์ฑ๋ ํจ๊ป ๊ฐ์ ธ์ต๋๋ค. ๋ค์์ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก์
๋๋ค:
- ๋ฐ์ดํฐ ๊ฒฝ์: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๋ฐ์ดํฐ ๊ฒฝ์์ผ๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํด ํญ์ ์์์ ์ฐ์ฐ์ ์ฌ์ฉํ์ญ์์ค. ์ ์ฌ์ ์ธ ๊ฒฝ์ ์กฐ๊ฑด์ ์๋ณํ๊ณ ๋ชจ๋ ๊ณต์ ๋ฐ์ดํฐ๊ฐ ์ ์ ํ ๋๊ธฐํ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ ์คํ๊ฒ ๋ถ์ํ์ญ์์ค.
- ๊ฑฐ์ง ๊ณต์ (False Sharing): ๊ฑฐ์ง ๊ณต์ ๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผํ ์บ์ ๋ผ์ธ ๋ด์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ๊ทผํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ก ์ธํด ์บ์ ๋ผ์ธ์ด ์ค๋ ๋ ๊ฐ์ ์ง์์ ์ผ๋ก ๋ฌดํจํ๋๊ณ ๋ค์ ๋ก๋๋๋ฏ๋ก ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๊ฑฐ์ง ๊ณต์ ๋ฅผ ํผํ๋ ค๋ฉด ๊ฐ ์ค๋ ๋๊ฐ ์์ฒด ์บ์ ๋ผ์ธ์ ์ ๊ทผํ๋๋ก ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํจ๋ฉ(padding)ํ์ญ์์ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ (Memory Ordering): ์์์ ์ฐ์ฐ์ด ์ ๊ณตํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ณด์ฅ์ ์ดํดํ์ญ์์ค. JavaScript์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๋น๊ต์ ๋์จํ๋ฏ๋ก, ์ฐ์ฐ์ด ์ํ๋ ์์๋ก ์คํ๋๋๋ก ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ(fences)์ ์ฌ์ฉํด์ผ ํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ JavaScript์ Atomics๋ ์ด๋ฏธ ์์ฐจ์ ์ผ๊ด์ฑ ์์๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๋์์ฑ์ ๋ํ ์ถ๋ก ์ ๋จ์ํํฉ๋๋ค.
- ์ฑ๋ฅ ์ค๋ฒํค๋: ์์์ ์ฐ์ฐ์ ๋น์์์ ์ฐ์ฐ์ ๋นํด ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ์์ ์ ์์ต๋๋ค. ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํด์ผ ํ ๋๋ง ์ ์คํ๊ฒ ์ฌ์ฉํ์ญ์์ค. ๋์์ฑ๊ณผ ๋๊ธฐํ ์ค๋ฒํค๋ ์ฌ์ด์ ํธ๋ ์ด๋์คํ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๋๋ฒ๊น : ๋์์ฑ ์ฝ๋ ๋๋ฒ๊น ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ก๊น ๋ฐ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ์ ์กฐ๊ฑด ๋ฐ ๊ธฐํ ๋์์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ์ญ์์ค. ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ์ค๊ณ๋ ์ ๋ฌธ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ณด์ ์ํฅ: ์ค๋ ๋ ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ์ ๋ณด์ ์ํฅ์ ์ ์ํ์ญ์์ค. ์ ์์ ์ธ ์ฝ๋๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ทจ์ฝ์ ์ ์ ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ ์ ๋ ฅ์ ์ ์ ํ๊ฒ ์ ๋ฆฌํ๊ณ ๊ฒ์ฆํ์ญ์์ค. ์ ์ ํ Cross-Origin-Opener-Policy ๋ฐ Cross-Origin-Embedder-Policy ํค๋๊ฐ ์ค์ ๋์๋์ง ํ์ธํ์ญ์์ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ: ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํผํ๊ณ ๋์์ฑ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์์๋ก๋ ๋ก-ํ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋๋ ์์ ์ค์ผ์ค๋ง ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
SharedArrayBuffer ๋ฐ Atomics์ ๋์
SharedArrayBuffer์ Atomics๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๋ชจ๋ ๋ฌธ์ ์ ๋ํ ์ต์์ ํด๊ฒฐ์ฑ
์ ์๋๋๋ค. ๊ณ ๋ คํ ์ ์๋ ๋ช ๊ฐ์ง ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฉ์์ง ์ ๋ฌ:
postMessage๋ฅผ ์ฌ์ฉํ์ฌ Web Workers ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํผํ๊ณ ๊ฒฝ์ ์กฐ๊ฑด์ ์ํ์ ์ ๊ฑฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๊ณผ์ ์ด ํฌํจ๋๋ฏ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์๋ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. - WebAssembly ์ค๋ ๋: WebAssembly๋ ์ค๋ ๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ํ๋ฉฐ,
SharedArrayBuffer๋ฐAtomics์ ๋ํ ํ์ ์์ค์ ๋์์ ์ ๊ณตํฉ๋๋ค. WebAssembly๋ฅผ ์ฌ์ฉํ๋ฉด C++ ๋๋ Rust์ ๊ฐ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ์ฑ๋ฅ ๋์์ฑ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. - ์๋ฒ๋ก ์คํ๋ก๋ฉ: ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๊ฒฝ์ฐ, ์์ ์ ์๋ฒ๋ก ์คํ๋ก๋ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ๊ฐ์ฉ์ฑ
SharedArrayBuffer์ Atomics๋ Chrome, Firefox, Safari, Edge๋ฅผ ํฌํจํ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ง์ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ํ ๋ณด์์์ ์ด์ ๋ก ์ ์ ํ HTTP ํค๋(COOP/COEP)๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ํ์ํ ํค๋๊ฐ ์์ผ๋ฉด SharedArrayBuffer๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ํด ๋นํ์ฑํ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
SharedArrayBuffer์ Atomics๋ JavaScript ๊ธฐ๋ฅ์ ์๋นํ ๋ฐ์ ์ ๋ํ๋ด๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ์ด์ ์๋ ๋ถ๊ฐ๋ฅํ๋ ๊ณ ์ฑ๋ฅ ๋์์ฑ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์๋๋ก ํฉ๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, ์์์ ์ฐ์ฐ, ๊ทธ๋ฆฌ๊ณ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฌ์ ํจ์ ์ ์ดํดํจ์ผ๋ก์จ, ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ํ์ ์ ์ด๊ณ ํจ์จ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก์ ํธ์ SharedArrayBuffer์ Atomics๋ฅผ ์ฑํํ๊ธฐ ์ ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ , ๋ณด์์ ์ฐ์ ์ํ๋ฉฐ, ํธ๋ ์ด๋์คํ๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์น ํ๋ซํผ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์ด๋ฌํ ๊ธฐ์ ์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ฅํ ๊ฒ์ ํ๊ณ๋ฅผ ํ์ฅํ๋ ๋ฐ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์
๋๋ค. ์ฌ์ฉํ๊ธฐ ์ ์ ์ฃผ๋ก ์ ์ ํ COOP/COEP ํค๋ ๊ตฌ์ฑ์ ํตํด ๋ฐ์ํ ์ ์๋ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ํ์ธํ์ญ์์ค.